package shujia.day10;

import java.util.ArrayList;
import java.util.Collection;

/*
    泛型通配符<?>
        任意类型，如果没有明确，那么就是Object以及任意的Java类了
    ? extends E
        向下限定，E及其子类
    ? super E
        向上限定，E及其父类

 */
class Animal {

}

class Dog extends Animal {

}

class Cat extends Animal {

}

class Demo3 {
    public void fun1(Collection<?> c1) { // 可以接收元素是任意引用数据类型的Collection集合对象
        System.out.println("c1: " + c1);
    }

    public void fun2(Collection<? extends Animal> c1) { // 可以接收元素是Animal类型或Animal的子类类型的的Collection集合对象
        System.out.println("c1: " + c1);
    }

    public void fun3(Collection<? super Animal> c1) { // 可以接收元素是Animal类型或Animal的父类类型的的Collection集合对象
        System.out.println("c1: " + c1);
    }



//    public void fun1(Xxxx<?> c1) { // 可以接收元素是任意引用数据类型的Xxxx对象
//        System.out.println("c1: " + c1);
//    }
}

public class FanXingDemo5 {
    public static void main(String[] args) {
        Demo3 d1 = new Demo3();
        ArrayList<Animal> list1 = new ArrayList<>();
        ArrayList<Dog> list2 = new ArrayList<>();
        ArrayList<Cat> list3 = new ArrayList<>();
        ArrayList<Object> list4 = new ArrayList<>();
        //Collection<?> c1
        d1.fun1(list1);
        d1.fun1(list2);
        d1.fun1(list3);
        d1.fun1(list4);


        d1.fun2(list1);
        d1.fun2(list2);
        d1.fun2(list3);
//        d1.fun2(list4);


        d1.fun3(list1);
//        d1.fun3(list2);
//        d1.fun3(list3);
        d1.fun3(list4);


        //public boolean addAll(Collection<? extends Animal> c)
        ArrayList<Animal> animals = new ArrayList<>();
        animals.addAll(list1);
        animals.addAll(list2);
        animals.addAll(list3);
//        animals.addAll(list4);
    }
}
